package com.wande.dataplatform.common.utils;

import cn.hutool.core.util.StrUtil;

import java.util.regex.Pattern;

/**
 * SQL 工具类
 *
 * @author ruoyi
 */
public class SqlUtils {

    /**
     * SQL 注入检测正则
     */
    private static final Pattern SQL_INJECTION_PATTERN = Pattern.compile(
        "(?i)(\\b(select|insert|update|delete|drop|create|alter|exec|execute|script|javascript|eval)\\b)|" +
        "(--|;|/\\*|\\*/|xp_|sp_|0x|char\\(|cast\\(|convert\\()"
    );

    /**
     * 检查 SQL 是否存在注入风险
     *
     * @param sql SQL 语句
     * @return true-存在风险，false-安全
     */
    public static boolean hasSqlInjection(String sql) {
        if (StrUtil.isBlank(sql)) {
            return false;
        }
        return SQL_INJECTION_PATTERN.matcher(sql).find();
    }

    /**
     * 转义 SQL 特殊字符
     *
     * @param value 值
     * @return 转义后的值
     */
    public static String escapeSql(String value) {
        if (StrUtil.isBlank(value)) {
            return value;
        }
        return value.replace("'", "''")
            .replace("\\", "\\\\")
            .replace("\n", "\\n")
            .replace("\r", "\\r")
            .replace("\t", "\\t");
    }

    /**
     * 构建分页 SQL
     *
     * @param sql      原始 SQL
     * @param pageNum  页码
     * @param pageSize 每页大小
     * @return 分页 SQL
     */
    public static String buildPageSql(String sql, int pageNum, int pageSize) {
        int offset = (pageNum - 1) * pageSize;
        return sql + " LIMIT " + offset + ", " + pageSize;
    }

    /**
     * 验证表名或字段名是否合法
     *
     * @param name 名称
     * @return true-合法，false-非法
     */
    public static boolean isValidIdentifier(String name) {
        if (StrUtil.isBlank(name)) {
            return false;
        }
        // 只允许字母、数字、下划线，且不能以数字开头
        return name.matches("^[a-zA-Z_][a-zA-Z0-9_]*$");
    }

}
